/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package nexus.adec;

import au.com.bytecode.opencsv.CSVReader;
import control.MessageFactory;
import control.UserBean;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.el.VariableResolver;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.swing.JOptionPane;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;

public class RegistrarUsuario {
    private boolean soloUno;
    private boolean conGrupo;
    private String codigoCarrera;
    private String codigoMateria;
    private String codigoGrupo;
    private String codigoRol;
    private String codSis;
    private String nombreCompleto;
    private String contra;
    private UploadedFile file;
    public RegistrarUsuario(){
        soloUno=false;
        conGrupo=false;

    }
    public boolean tieneNumero(String c){
        for(int i=0;i<c.length();i++){
            char x=c.charAt(i);
            if(x>='0'&&x<='9'){
                return true;
            }
        }
        return false;
    }
    public void registrar(){
        FacesMessage mensaje;
        if(tieneNumero(nombreCompleto)){
            mensaje = new FacesMessage("El nombre de usuario no debe contener numeros","El nombre de usuario no debe contener numeros");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
        }
        try{
        ArrayList<Usuario> lista=new ArrayList<Usuario>();
        if(!soloUno){
            if(codSis!=null && contra!=null && nombreCompleto!=null && !codSis.equals("") && !contra.equals("") && !nombreCompleto.equals("")) {
                Usuario user=new Usuario(codSis,contra,nombreCompleto,"sin-mail","sin-descripcion");
                lista.add(user);
            } else {
                if(codSis==null|| codSis.equals("")) {
                    mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "errorInputCodigoSisVacio", "");
                    FacesContext.getCurrentInstance().addMessage(null, mensaje);
                }
                if(nombreCompleto==null||nombreCompleto.equals("")) {
                    mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "errorInputNombreVacio", "");
                    FacesContext.getCurrentInstance().addMessage(null, mensaje);
                }
                if(contra==null||contra.equals("")) {
                    mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "errorInputContraseñaVacio", "");
                    FacesContext.getCurrentInstance().addMessage(null, mensaje);
                }
            }
        }else{
            if(file.getName().endsWith(".csv")){
                    cargarDeCvs(lista);
            }else if(file.getName().endsWith(".xls")){
                cargarDeXls(lista);
            }else{
                mensaje  = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR,"errorCargarElArchivo", "");
                FacesContext.getCurrentInstance().addMessage(null, mensaje);
            }

        }

        if(conGrupo){
            GestorEspacioDB.getInstance().inscribir(getUsuario().getCodigoCurso(),codigoRol,lista,codigoCarrera,codigoMateria,codigoGrupo);
        }else{
            GestorEspacioDB.getInstance().inscribir(getUsuario().getCodigoCurso(),codigoRol,lista);
        }
        /*
        mensaje = new FacesMessage("Se inscribio a el o los usuarios correctamente","Se registro el o los usuarios correctamente");
        FacesContext.getCurrentInstance().addMessage(null, mensaje);*/
        //JOptionPane.showMessageDialog(null,"mando el mensaje");
        }catch(Exception e){
            if(e.getMessage()!=null) {
                Scanner in = new Scanner(e.getMessage());
                while (in.hasNext()) {
                    String string = in.nextLine();
                    mensaje = new FacesMessage(string,string);
                    FacesContext.getCurrentInstance().addMessage(null, mensaje);
                }
            } else {
                mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR,"errorIntroducirArchivo", "");
                FacesContext.getCurrentInstance().addMessage(null, mensaje);
            }
            
        }

    }
      private void cargarDeXls(ArrayList<Usuario> us){
            try{
                InputStream inp=file.getInputStream();
                HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(inp));
                int n=wb.getNumberOfSheets();
                HSSFSheet ss=wb.getSheetAt(0);
                for(Row row : ss){
                    Iterator<Cell> cls=row.iterator();
                    String id=toString(cls.next());
                    String nc=toString(cls.next());
                    String cn=toString(cls.next());
                    us.add(new Usuario(id,cn,nc,"sin-mail","sin-descripsion"));
                }
            }catch(Exception e){

            }
        }
        private void cargarDeCvs(ArrayList<Usuario> us) throws UnsupportedEncodingException, IOException{
            try {
                CSVReader csvReader = new CSVReader(new InputStreamReader(file.getInputStream()   , "UTF-8"), CSVReader.DEFAULT_SEPARATOR, CSVReader.DEFAULT_QUOTE_CHARACTER, 1);
                List<String[]> myEntries = csvReader.readAll();
                for (String[] entry : myEntries) {
                    us.add(new Usuario(entry[0],entry[2],entry[1],"sin-mail","sin-descripsion"));
                }
            } catch (IOException ex) {

            }
        }

    public ArrayList<SelectItem> getModos(){
        ArrayList<SelectItem> items=new ArrayList<SelectItem>();
        if(!soloUno){
            items.add(new SelectItem("0","SUBIR UNO"));
            items.add(new SelectItem("1","SUBIR VARIOS"));
        }else{
            items.add(new SelectItem("1","SUBIR VARIOS"));
            items.add(new SelectItem("0","SUBIR UNO"));
        }
        return items;
    }
    public boolean getSoloUno(){
        return soloUno;
    }
    public void changeModo(ValueChangeEvent cve){
        String nv=(String)cve.getNewValue();
        if(!nv.equals("0")){
            soloUno=true;
        }else{
            soloUno=false;
        }

    }

    public ArrayList<SelectItem> getCarreras(){
        ArrayList<SelectItem> items=new ArrayList<SelectItem>();
        items.add(new SelectItem("0","NINGUNA"));
        ArrayList<Carrera> cs=GestorEspacioDB.getInstance().listarCarrerasEspacio(getUsuario().getCodigoCurso());
        for(Carrera c : cs){
            items.add(new SelectItem(c.getCodigoCarrera(),c.getNombreCarrera()));
        }
        return items;
    }
    public ArrayList<SelectItem> getGrupos(){
        ArrayList<SelectItem> items=new ArrayList<SelectItem>();
        ArrayList<String> gs=GestorEspacioDB.getInstance().listarGruposEspacio(getUsuario().getCodigoCurso(),codigoCarrera, codigoMateria);
        codigoGrupo=gs.get(0);
        for(String g :gs){
            items.add(new SelectItem(g,g));
        }
        return items;
    }
    public ArrayList<SelectItem> getMaterias(){
        ArrayList<SelectItem> items=new ArrayList<SelectItem>();
        ArrayList<Materia> ms=GestorEspacioDB.getInstance().listarMateriasEspacio(getUsuario().getCodigoCurso(), codigoCarrera);
        codigoMateria=ms.get(0).getCodigoMateria();
        for(Materia m : ms){
            items.add(new SelectItem(m.getCodigoMateria(),m.getNombreMateria()));
        }
        return items;
    }
    public ArrayList<SelectItem> getRoles(){
        ArrayList<SelectItem> items=new ArrayList<SelectItem>();
        ArrayList<Rol> rs=GestorEspacioDB.getInstance().listarRoles();
        for(Rol r : rs){
            items.add(new SelectItem(r.getCodigoRolEspacio(),r.getNombreRol()));
        }
        return items;
    }
    public void setRol(String cr){
        codigoRol=cr;
    }
    public String getRol(){return codigoRol;}
    public void setCarrera(String cc){codigoCarrera=cc;}
    public String getCarrera(){return codigoCarrera;}
    public void setMateria(String cm){codigoMateria=cm;}
    public String getMateria(){return codigoMateria;}
    public void setGrupo(String cg){codigoGrupo=cg;}
    public String getGrupo(){return codigoGrupo;}
    public String getNombreCompleto(){return nombreCompleto;}
    public void setNombreCompleto(String nc){nombreCompleto=nc;}
    public String getCodSis(){return codSis;}
    public void setCodSis(String s){codSis=s;}
    public String getContra(){return contra;}
    public void setContra(String c){contra=c;}
    public UploadedFile getFile(){return file;}
    public void setFile(UploadedFile f){file=f;}
    public void changeCarrera(ValueChangeEvent cve){
        String nv=(String)cve.getNewValue();
        if(!nv.equals("0")){
            codigoCarrera=nv;
            conGrupo=true;
        }else{
            conGrupo=false;
        }
    }
    public boolean getConGrupo(){
        return conGrupo;
    }
    public void setConGrupo(boolean cg){
        conGrupo=cg;
    }
    public UserBean getUsuario(){
        FacesContext facesContext = FacesContext.getCurrentInstance();
        VariableResolver vr = facesContext.getApplication().getVariableResolver();
        UserBean user = (UserBean)vr.resolveVariable(facesContext, "userBean");
        return user;
    }
    private String toString(Cell cell){
    String res="";
    switch(cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            res+=cell.getRichStringCellValue().getString();
            break;
        case Cell.CELL_TYPE_NUMERIC:
            if(DateUtil.isCellDateFormatted(cell)) {
            res+=cell.getDateCellValue().toString();
            } else {
            res+= (int)cell.getNumericCellValue();
            }
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            res+=cell.getBooleanCellValue();
        break;
        case Cell.CELL_TYPE_FORMULA:
            res+=cell.getCellFormula();
            break;
        default:
    }
    return res;
    }
}
